#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <list>
#include <atomic>

using std::cout;
using std::endl;

struct AtomicCounter{
    //std::atomic<int> value;
    int value = 0;
    void increment() {
        ++value;
    }

    void decrement()
    {
        --value;
    }

    int get()
    {
        //return value.load();
        return value;
    }
};


AtomicCounter st;
void fun1()
{
    for(int i = 0; i < 10; i++)
    {
        std::this_thread::sleep_for (std::chrono::milliseconds(10));
        st.increment();
    }
}

void fun2()
{
    for(int i = 0; i < 10; i++)
    {
        std::this_thread::sleep_for (std::chrono::milliseconds(10));
        st.decrement();
    }
}

void fun3()
{
    for(int i = 0; i < 10; i++)
    {
        std::this_thread::sleep_for (std::chrono::milliseconds(10));
        cout <<"Get : " <<   st.get() << endl;
    }
}


int main(void)
{
    st.value = 0;

    std::thread t1(fun1);
    std::thread t2(fun2);
    std::thread t3(fun3);

    t3.join();
    t1.join();
    t2.join();

    return 0;
}
